JSON 函数和操作符

您所在的位置:网站首页 mysql jsonb类型 JSON 函数和操作符

JSON 函数和操作符

2023-10-25 19:41| 来源: 网络整理| 查看: 265

9.15. JSON 函数和操作符

表 9-40展示了可以用于两种 JSON 数据类型(见第 8.14 节)的操作符。

表 9-40. json和jsonb 操作符

操作符右操作数类型描述例子例子结果->int获得 JSON 数组元素(索引从 0 开始,负整数结束)'[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2{"c":"baz"}->text通过键获得 JSON 对象域'{"a": {"b":"foo"}}'::json->'a'{"b":"foo"}->>int以文本形式获得 JSON 数组元素'[1,2,3]'::json->>23->>text以文本形式获得 JSON 对象域'{"a":1,"b":2}'::json->>'b'2#>text[]获取在指定路径的 JSON 对象'{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}'{"c": "foo"}#>>text[]以文本形式获取在指定路径的 JSON 对象'{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}'3

注意: 对json和jsonb类型,这些操作符都有其并行变体。 域/元素/路径抽取操作符返回与其左手输入(json或jsonb) 相同的类型,不过那些被指定为返回text的除外,它们的返回值会被强制 为文本。如果该 JSON 输入没有匹配请求的正确结构(例如那样的元素不存在),这些域/元素/路径抽取操作符会返回 NULL 而不是失败。 接受整数JSON数组下标的域/元素/路径提取操作符支持数组末尾的负下标。

表 9-1中展示的标准比较操作符只对 jsonb有效,而不适合json。它们遵循在第 8.14.4 节中给出的 B 树操作规则。

如表 9-41中所示,还存在一些只适合 jsonb的操作符。这些操作符中的很多可以用jsonb 操作符类索引。jsonb包含和存在语义的完整描述可参见第 8.14.3 节。第 8.14.4 节描述了如何 用这些操作符来有效地索引jsonb数据。

表 9-41. 额外的jsonb操作符

操作符右操作数类型描述例子@>jsonb左边的 JSON 值是否包含顶层右边JSON路径/值项?'{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb>操作符)。 json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4', 'f6')foo

json_object_keys(json)

jsonb_object_keys(jsonb)

setof text 返回最外层 JSON 对象中的键集合。 json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') json_object_keys ------------------ f1 f2

json_populate_record(base anyelement, from_json json)

jsonb_populate_record(base anyelement, from_json jsonb)

anyelement 扩展from_json中的对象成一个行,它的列匹配由base定义的记录类型(见下文的注释)。 select * from json_populate_record(null::myrowtype, '{"a":1,"b":2}') a | b ---+--- 1 | 2

json_populate_recordset(base anyelement, from_json json)

jsonb_populate_recordset(base anyelement, from_json jsonb)

setof anyelement 扩展from_json中最外的对象数组为一个集合,该集合的列匹配由base定义的记录类型。 select * from json_populate_recordset(null::myrowtype, '[{"a":1,"b":2},{"a":3,"b":4}]') a | b ---+--- 1 | 2 3 | 4

json_array_elements(json)

jsonb_array_elements(jsonb)

setof json

setof jsonb

把一个 JSON 数组扩展成一个 JSON 值的集合。 select * from json_array_elements('[1,true, [2,false]]') value ----------- 1 true [2,false]

json_array_elements_text(json)

jsonb_array_elements_text(jsonb)

setof text 把一个 JSON 数组扩展成一个text值集合。 select * from json_array_elements_text('["foo", "bar"]') value ----------- foo bar

json_typeof(json)

jsonb_typeof(jsonb)

text 把最外层的 JSON 值的类型作为一个文本字符串返回。可能的类型是: object、array、string、number、 boolean以及null。 json_typeof('-123.4')number

json_to_record(json)

jsonb_to_record(jsonb)

record 从一个 JSON 对象(见下文的注解)构建一个任意的记录。正如所有返回record 的函数一样,调用者必须用一个AS子句显式地定义记录的结构。 select * from json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') as x(a int, b text, d text) a | b | d ---+---------+--- 1 | [1,2,3] |

json_to_recordset(json)

jsonb_to_recordset(jsonb)

setof record 从一个 JSON 对象数组(见下文的注解)构建一个任意的记录集合。正如所有返回record 的函数一样,调用者必须用一个AS子句显式地定义记录的结构。 select * from json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') as x(a int, b text); a | b ---+----- 1 | foo 2 |

json_strip_nulls(from_json json)

jsonb_strip_nulls(from_json jsonb)

json

jsonb

返回具有空值对象域的from_json。其它空值不变。 json_strip_nulls('[{"f1":1,"f2":null},2,null,3]')[{"f1":1},2,null,3]

jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])

jsonb

如果create_missing是真的 (缺省是true)并且通过path 指定部分不存在,那么返回target, 它具有path指定部分, new_value替换部分, 或者new_value添加部分。 正如路径导向的操作符,负整数出现在JSON数组结尾的path>计数中。

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false)

jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}','[2,3,4]')

[{"f1":[2,3,4],"f2":null},2,null,3]

[{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]

jsonb_pretty(from_json jsonb)

text

作为缩进JSON文本返回from_json。 jsonb_pretty('[{"f1":1,"f2":null},2,null,3]')[ { "f1": 1, "f2": null }, 2, null, 3 ]

注意: 很多这些函数和操作符将把 JSON 字符串中的 Unicode 转义转换成合适的单一字符。如果 输入类型是jsonb,这就没有问题,因为该转换已经完成了。但是对于json 输入,这可能会导致抛出一个错误(如第 8.14 节所述)。

注意: 在json_populate_record、json_populate_recordset、 json_to_record和json_to_recordset中,来自 JSON 的 类型强制是"尽力而为"并且对于某些类型可能得不到想要的值。JSON 键会被 匹配目标行类型中相同的列名。没有出现在目标行类型中的 JSON 域将会被从输出中忽略, 并且不匹配任何 JSON 域的目标列将被简单地作为 NULL。

注意: 所有jsonb_set的path参数项必须存在于target中, 除非create_missing是真的,在这种情况下,除了最后一项都存在。 如果这些条件未满足target返回不变。

如果最后路径项是对象键,如果它不存在并且给予新值,则被创建。 如果最后路径项是一个数组索引,如果通过从左边计数发现设置项是正数, 如果从右边- -1计数负数指定右边的元素,等等。 如果项超出-array_length .. array_length -1范围,并且create_missing是真, 如果项是负数,则在数组开头添加新值,如果是正数,则添加到数组末尾。

注意: 不要把json_typeof函数的null返回值与 SQL 的 NULL 弄混。 虽然调用json_typeof('null'::json)将会返回null,但调用 json_typeof(NULL::json)将会返回一个 SQL 的 NULL。

注意: 如果参数到json_strip_nulls包含任何对象的复制字段名, 其结果可能是语义上不同,依赖于它们所产生的顺序。 这不是jsonb_strip_nulls的问题, 因为jsonb值从不复制对象字段名。

也可参见第 9.20 节了解聚集函数json_agg,它可以把记录值聚集成 JSON。还有聚集函数json_object_agg,它可以把值对 聚集成一个 JSON 对象,以及jsonb等价物, jsonb_agg和jsonb_object_agg。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3